import { onMounted, onUnmounted, ref } from 'vue';
import { EventManager, EVENT_NAMES } from '@/utils/eventManager';

/**
 * Vue组合式函数：使用全局事件管理器
 * @param eventName 事件名称
 * @param callback 回调函数
 * @param options 配置选项
 * @returns 返回控制函数
 */
export function useEventManager(
    eventName: string,
    callback: (data: any) => void,
    options: {
        once?: boolean;
        autoCleanup?: boolean;
    } = {}
) {
    const { once = false, autoCleanup = true } = options;
    const isListening = ref(false);

    // 订阅事件
    const subscribe = () => {
        if (once) {
            EventManager.once(eventName, callback);
        } else {
            EventManager.on(eventName, callback);
        }
        isListening.value = true;
    };

    // 取消订阅
    const unsubscribe = () => {
        EventManager.off(eventName, callback);
        isListening.value = false;
    };

    // 手动发布事件
    const emit = (data?: any) => {
        EventManager.emit(eventName, data);
    };

    // 获取监听器数量
    const getListenerCount = () => {
        return EventManager.getListenerCount(eventName);
    };

    // 组件挂载时自动订阅
    if (autoCleanup) {
        onMounted(() => {
            subscribe();
        });

        onUnmounted(() => {
            unsubscribe();
        });
    }

    return {
        subscribe,
        unsubscribe,
        emit,
        getListenerCount,
        isListening
    };
}

/**
 * 组合式函数：监听医院变化事件
 * @param callback 回调函数
 * @returns 返回控制函数
 */
export function useHospitalChangeListener(callback: (data: any) => void) {
    return useEventManager(EVENT_NAMES.HOSPITAL_CHANGE, callback);
}

/**
 * 组合式函数：监听系统机构变化事件
 * @param callback 回调函数
 * @returns 返回控制函数
 */
export function useSysOrgChangeListener(callback: (data: any) => void) {
    return useEventManager(EVENT_NAMES.SYS_ORG_CHANGE, callback);
}

/**
 * 组合式函数：监听用户登录事件
 * @param callback 回调函数
 * @param once 是否只执行一次
 * @returns 返回控制函数
 */
export function useUserLoginListener(callback: (data: any) => void, once: boolean = true) {
    return useEventManager(EVENT_NAMES.USER_LOGIN, callback, { once });
}

/**
 * 组合式函数：监听健康码更新事件
 * @param callback 回调函数
 * @returns 返回控制函数
 */
export function useHealthCodeUpdateListener(callback: (data: any) => void) {
    return useEventManager(EVENT_NAMES.HEALTH_CODE_UPDATE, callback);
}

/**
 * 使用示例：
 * 
 * // 基本使用
 * const { subscribe, unsubscribe, emit } = useEventManager('customEvent', (data) => {
 *     // 处理事件数据
 * });
 * 
 * // 监听医院变化
 * const { subscribe: subscribeHospital } = useHospitalChangeListener((data) => {
 *     // 重新加载数据
 *     loadData();
 * });
 * 
 * // 监听用户登录（只执行一次）
 * const { subscribe: subscribeLogin } = useUserLoginListener((user) => {
 *     // 初始化用户相关数据
 *     initUserData();
 * }, true);
 * 
 * // 手动发布事件
 * emit({ message: 'Hello World' });
 */
